package br.com.gkarian.mydesk.services.financeiro;

import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;

import br.com.caelum.vraptor.ioc.Component;
import br.com.gkarian.mydesk.dao.financeiro.interfaces.TipoTransacaoDAO;
import br.com.gkarian.mydesk.model.Usuario;
import br.com.gkarian.mydesk.model.financeiro.TipoTransacao;
import br.com.gkarian.mydesk.services.financeiro.interfaces.TipoTransacaoService;
import br.com.gkarian.mydesk.services.interfaces.UsuarioService;

@Component
@Transactional(propagation = Propagation.REQUIRED, readOnly = false)
public class TipoTransacaoServiceImpl implements TipoTransacaoService {

	private static final Logger LOG = Logger
			.getLogger(TipoTransacaoServiceImpl.class);

	private TipoTransacaoDAO tipoTransacaoDao;
	private UsuarioService usuarioService;

	public TipoTransacaoServiceImpl(TipoTransacaoDAO tipoTransacaoDao,
			UsuarioService usuarioService) {
		this.tipoTransacaoDao = tipoTransacaoDao;
		this.usuarioService = usuarioService;
	}

	@Override
	public void cadastrarTipoTransacao(TipoTransacao tipoTransacao,
			Usuario usuario) throws Exception {
		LOG.info("TipoTransacao sendo cadastrada em Usuario de ID ["
				+ usuario.getId() + "]");
		tipoTransacao.setUsuario(usuario);
		tipoTransacao = tipoTransacaoDao.salvar(tipoTransacao);
		LOG.info("TipoTransacao com ID [" + tipoTransacao.getId()
				+ "] foi cadastrada com sucesso para o Usuario de ID ["
				+ usuario.getId() + "]");
	}

	@Override
	public TipoTransacao carregarTipoTransacao(Integer id) throws Exception {
		LOG.info("Recuperando TipoTransacao de ID [" + id + "]");
		TipoTransacao tipoTransacao = tipoTransacaoDao.carregar(id);
		LOG.info("TipoTransacao de ID [" + tipoTransacao
				+ "] recuperado com sucesso");
		return tipoTransacao;
	}

	@Override
	public void atualizarTipoTransacao(TipoTransacao tipoTransacao)
			throws Exception {
		LOG.info("TipoTransacao de ID [" + tipoTransacao.getId()
				+ "] será atualizada");
		tipoTransacaoDao.atualizar(tipoTransacao);
		LOG.info("TipoTransacao de ID [" + tipoTransacao.getId()
				+ "] foi atualizado com sucesso");
	}

	@Override
	public List<TipoTransacao> listarTipoTransacaoPorUsuario(Usuario usuario)
			throws Exception {
		LOG.info("Listando TipoTransacao do Usuario com ID [" + usuario.getId()
				+ "]");
		List<TipoTransacao> listTipoTransacao = usuarioService
				.carregarComListTipoTransacao(usuario).getListTipoTransacao();
		LOG.info("Foi recuperado " + listTipoTransacao.size()
				+ " TipoTransacao do Usuario de ID [" + usuario.getId() + "]");
		return listTipoTransacao;
	}

	@Override
	public void removerTipoTransacao(TipoTransacao tipoTransacao)
			throws Exception {
		LOG.info("Removendo TipoTransacao de ID [" + tipoTransacao.getId()
				+ "]");
		tipoTransacaoDao.remover(tipoTransacao);
		LOG.info("TipoTransacao de ID [" + tipoTransacao.getId()
				+ "] removido com sucesso");
	}
}
